#ifndef LOCKQUEUE_H
#define LOCKQUEUE_H

#include <queue> // 基于C++queue改进
#include <thread>
#include <mutex>              // 基于linux pthread_mutex
#include <condition_variable> // 基于linux pthread_condition_t

/*
    linux线程之间互斥用互斥锁， 二元信号量， 线程间通信用信号量
 */

// 异步写日志的日志队列
template <typename T>
class LockQueue
{
public:
    // 向队列中添加元素
    void enqueue(const T &item)
    {
        std::lock_guard<std::mutex> lock(m_mutex); // 自动管理锁的获取和释放
        m_queue.push(item);
        m_condvariable.notify_one(); // 通知等待的线程有新数据可用
    }

    // 从队列中移除并返回第一个元素，如果队列为空则阻塞直到有元素可用
    T dequeue()
    {
        std::unique_lock<std::mutex> lock(m_mutex); // 使用 unique_lock 因为需要调用 wait 方法
        m_condvariable.wait(lock, [this]
                            { return !m_queue.empty(); }); // 等待状态(释放锁)直到队列非空(加锁)
        T front = m_queue.front();
        m_queue.pop();
        return front;
    }

    // 检查队列是否为空
    bool empty() const
    {
        std::lock_guard<std::mutex> lock(m_mutex);
        return m_queue.empty();
    }

    // 获取队列中的元素数量
    size_t size() const
    {
        std::lock_guard<std::mutex> lock(m_mutex);
        return m_queue.size();
    }

private:
    std::queue<T> m_queue;                  // 数据存储
    mutable std::mutex m_mutex;             // 互斥锁，保护对 m_queue 的访问
    std::condition_variable m_condvariable; // 条件变量，用于同步
};

#endif